#ifndef __DVEC4_H__
#define __DVEC4_H__

namespace libvec
{
  struct vec4;
  struct dvec2;
  struct dvec3;
  struct dmat4;

  struct dvec4
  {
    double x, y, z, w;

    dvec4();
    dvec4(vec4 v);
    dvec4(double value);
    dvec4(dvec3 v, double w);
    dvec4(dvec2 v, double z, double w);
    dvec4(double x, double y, double z, double w);

    double &operator[](int index);

    dvec4 operator=(dvec4 v);

    bool operator==(dvec4 v);
    bool operator!=(dvec4 v);

    dvec4 &operator+();
    dvec4 &operator-();

    dvec4 operator+(dvec4 v);
    dvec4 operator+=(dvec4 v);
    dvec4 operator-(dvec4 v);
    dvec4 operator-=(dvec4 v);
    dvec4 operator*(dmat4 m);
    dvec4 operator*=(dmat4 m);
    dvec4 operator*(double scale);
    dvec4 operator*=(double scale);
    dvec4 operator/(double scale);
    dvec4 operator/=(double scale);
  };
}

#endif /* __DVEC4_H__ */
